package com.jp.juc.completableFuture;

import java.util.concurrent.CompletableFuture;

/**
 * 异步任务结束时，会自动回调某个对象的方法；
 * 异步任务出错时，会自动回调某个对象的方法；
 * 主线程设置好回调后，不再关心异步任务的执行
 */
public class M1 {
    public static void main(String[] args) throws InterruptedException {
        // 创建异步执行任务:
        CompletableFuture<Double> cf = CompletableFuture.supplyAsync(M1::fetchPrice);
        // 如果执行成功：
        cf.thenAccept((result) -> System.out.println("price：" + result));
        // 如果执行异常：
        cf.exceptionally((e) -> {
            e.printStackTrace();
            System.out.println("price：err");
            return null;
        });
        // 主线程不要立刻结束，否则CompletableFuture默认使用的线程池会立刻关闭:
        Thread.sleep(200);
    }

    static Double fetchPrice() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (Math.random() < 0.3) {
            throw new RuntimeException("fetch price failed!");
        }
        return 5 + Math.random() * 20;
    }

}
